/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * Caixa.java
 *
 * Created on 27/05/2013, 22:17:43
 */
package View.Venda;

import Model.ItemModel;
import Model.ProdutoModel;
import Model.VendaModel;
import Repositories.ProdutoRepository;
import Repositories.VendaRepository;
import java.awt.AWTKeyStroke;
import java.awt.KeyboardFocusManager;
import java.awt.event.KeyEvent;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;
import org.netbeans.lib.awtextra.AbsoluteLayout;

/**
 *
 * @author Yanne
 */
public class Caixa extends javax.swing.JDialog {

    ArrayList<ItemModel> itens = new ArrayList<ItemModel>();
    Double valorTotal = 0.0;
    DefaultTableModel model = new DefaultTableModel(new Object[][]{}, new Object[]{"Descrição", "Valor", "Quantidade"}){
            public boolean isCellEditable(int rowIndex, int mColIndex) {  
                return false;  
            }  
        };  
    int IdVenda = 0;

    /** Creates new form Caixa */
    public Caixa(java.awt.Frame parent, boolean modal) {
        super(parent, modal);
        initComponents();
        TabelaItens.setModel(model);
        Enter();
    }

    public Caixa(java.awt.Dialog parent, boolean modal) {
        super(parent, modal);
        initComponents();

        AbsoluteLayout absoluto = null;
        jp_caixa_faz_pedido.setLayout(absoluto);

        //bg novo usuario?
        JLabel jl_caixaFpedido = new JLabel(new ImageIcon("./img/bg_caixa_fazer_pedido.png"));
        jp_caixa_faz_pedido.add(jl_caixaFpedido);
        // jpn_listaProduto.setVisible(true);
        jl_caixaFpedido.setBounds(0, 0, 640, 580);
        this.setLocationRelativeTo(null);

        lblValorTotal.setText(Integer.toString(0));

        TabelaItens.setModel(model);

        Enter();
    }

    public Caixa(java.awt.Dialog parent, boolean modal, int IdVenda, int Mesa) {
        super(parent, modal);
        initComponents();


        AbsoluteLayout absoluto = null;
        jp_caixa_faz_pedido.setLayout(absoluto);

        //bg novo usuario?
        JLabel jl_caixaFpedido = new JLabel(new ImageIcon("./img/bg_caixa_alterar_pedido.png"));
        jp_caixa_faz_pedido.add(jl_caixaFpedido);
        // jpn_listaProduto.setVisible(true);
        jl_caixaFpedido.setBounds(0, 0, 640, 580);
        this.setLocationRelativeTo(null);

        this.IdVenda = IdVenda;
        txtMesa.setText(Integer.toString(Mesa));
        txtCodProduto.grabFocus();
        //TabelaItens.setModel(model);
        Enter();
        CarregarItens(IdVenda);
    }

    private void CarregarItens(int IdVenda) {
        try {
            VendaRepository vendaRepository = new VendaRepository();

            model = new DefaultTableModel(new Object[][]{}, new Object[]{"Descrição", "Valor", "Quantidade"}){
            public boolean isCellEditable(int rowIndex, int mColIndex) {  
                return false;  
            }  
        };  
            
            itens = vendaRepository.ListadeItens(IdVenda);
            if (itens != null) 
            {
                for (ItemModel item : itens) {
                    model.addRow(new Object[]{item.getITEM_DESCRICAO(), item.getITEM_VALOR(), item.getITEM_QUANTIDADE()});
                }

                   this.itens = itens;
    
                for (ItemModel item : itens) {
                    valorTotal += item.getITEM_VALOR();
                }

                lblValorTotal.setText(valorTotal.toString());

                TabelaItens.setModel(model);
            }
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage());
        }
    }

    private void Enter() {
        HashSet conj = new HashSet(txtMesa.getFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS));
        conj.add(AWTKeyStroke.getAWTKeyStroke(KeyEvent.VK_ENTER, 0));
        txtMesa.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, conj);

        //HashSet conj2 = new HashSet(txtCodProduto.getFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS)); 
        //conj.add(AWTKeyStroke.getAWTKeyStroke(KeyEvent.VK_ENTER, 0)); 
        //txtCodProduto.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, conj2);

        HashSet conj3 = new HashSet(txtQtd.getFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS));
        conj.add(AWTKeyStroke.getAWTKeyStroke(KeyEvent.VK_ENTER, 0));
        txtQtd.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, conj3);
    }

    private void Buscar() {
        try {
            ProdutoRepository produtoRepository = new ProdutoRepository();
            ProdutoModel produto = produtoRepository.GetProdutoId(Integer.parseInt(txtCodProduto.getText()));
            if (produto != null) {
                if (produto.getPRODUTO_ATIVO().equals("Inativo")) {
                    JOptionPane.showMessageDialog(null, "Produto não disponível!");
                } else {
                    txtProdutoDescricao.setText(produto.getPRODUTO_DESCRICAO());
                    txtValor.setText(produto.getPRODUTO_VALOR().toString());
                    txtQtd.grabFocus();
                }
            } else {
                JOptionPane.showMessageDialog(null, "Produto não encontrado!");
                txtProdutoDescricao.setText("");
                txtValor.setText("");
            }


        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage());
        }
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jp_caixa_faz_pedido = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        txtCodProduto = new javax.swing.JTextField();
        txtMesa = new javax.swing.JTextField();
        txtProdutoDescricao = new javax.swing.JTextField();
        Descricção = new javax.swing.JLabel();
        jLabel5 = new javax.swing.JLabel();
        lblValorTotal = new javax.swing.JLabel();
        btnPesquisar = new javax.swing.JButton();
        jLabel3 = new javax.swing.JLabel();
        txtQtd = new javax.swing.JTextField();
        jLabel4 = new javax.swing.JLabel();
        txtValor = new javax.swing.JTextField();
        btnAdicionar = new javax.swing.JButton();
        btnRemover = new javax.swing.JButton();
        jScrollPane1 = new javax.swing.JScrollPane();
        TabelaItens = new javax.swing.JTable();
        btnVenda = new javax.swing.JButton();
        btnCancelar = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);

        jp_caixa_faz_pedido.setBackground(new java.awt.Color(204, 255, 204));
        jp_caixa_faz_pedido.setMinimumSize(new java.awt.Dimension(640, 580));
        jp_caixa_faz_pedido.setPreferredSize(new java.awt.Dimension(640, 580));
        jp_caixa_faz_pedido.setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());

        jLabel1.setFont(new java.awt.Font("Arial", 1, 14));
        jLabel1.setText("Mesa:");
        jp_caixa_faz_pedido.add(jLabel1, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 43, -1, -1));

        jLabel2.setFont(new java.awt.Font("Arial", 1, 14));
        jLabel2.setText("Item:");
        jp_caixa_faz_pedido.add(jLabel2, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 121, -1, -1));

        txtCodProduto.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtCodProdutoActionPerformed(evt);
            }
        });
        jp_caixa_faz_pedido.add(txtCodProduto, new org.netbeans.lib.awtextra.AbsoluteConstraints(48, 114, 48, 33));

        txtMesa.setNextFocusableComponent(txtCodProduto);
        jp_caixa_faz_pedido.add(txtMesa, new org.netbeans.lib.awtextra.AbsoluteConstraints(56, 36, 73, 33));
        jp_caixa_faz_pedido.add(txtProdutoDescricao, new org.netbeans.lib.awtextra.AbsoluteConstraints(102, 114, 383, 33));

        Descricção.setFont(new java.awt.Font("Arial", 1, 14));
        Descricção.setText("Descrição");
        jp_caixa_faz_pedido.add(Descricção, new org.netbeans.lib.awtextra.AbsoluteConstraints(102, 87, -1, -1));

        jLabel5.setFont(new java.awt.Font("Arial", 1, 14));
        jLabel5.setText("Valor Total: ");
        jp_caixa_faz_pedido.add(jLabel5, new org.netbeans.lib.awtextra.AbsoluteConstraints(329, 43, -1, -1));

        lblValorTotal.setFont(new java.awt.Font("Arial", 1, 14));
        lblValorTotal.setText("jLabel6");
        jp_caixa_faz_pedido.add(lblValorTotal, new org.netbeans.lib.awtextra.AbsoluteConstraints(429, 43, -1, -1));

        btnPesquisar.setText("Procurar");
        btnPesquisar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnPesquisarActionPerformed(evt);
            }
        });
        jp_caixa_faz_pedido.add(btnPesquisar, new org.netbeans.lib.awtextra.AbsoluteConstraints(491, 110, -1, 40));

        jLabel3.setFont(new java.awt.Font("Arial", 1, 14));
        jLabel3.setText("Quantidade");
        jp_caixa_faz_pedido.add(jLabel3, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 176, -1, -1));

        txtQtd.setText("1");
        txtQtd.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtQtdActionPerformed(evt);
            }
        });
        jp_caixa_faz_pedido.add(txtQtd, new org.netbeans.lib.awtextra.AbsoluteConstraints(100, 170, 63, 34));

        jLabel4.setFont(new java.awt.Font("Arial", 1, 14));
        jLabel4.setText("Valor");
        jp_caixa_faz_pedido.add(jLabel4, new org.netbeans.lib.awtextra.AbsoluteConstraints(200, 176, 38, -1));
        jp_caixa_faz_pedido.add(txtValor, new org.netbeans.lib.awtextra.AbsoluteConstraints(248, 168, 63, 34));

        btnAdicionar.setText("Adicionar");
        btnAdicionar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnAdicionarActionPerformed(evt);
            }
        });
        jp_caixa_faz_pedido.add(btnAdicionar, new org.netbeans.lib.awtextra.AbsoluteConstraints(353, 162, 101, 40));

        btnRemover.setText("Remover");
        btnRemover.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnRemoverActionPerformed(evt);
            }
        });
        jp_caixa_faz_pedido.add(btnRemover, new org.netbeans.lib.awtextra.AbsoluteConstraints(472, 162, 92, 40));

        TabelaItens.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null}
            },
            new String [] {
                "Title 1", "Title 2", "Title 3", "Title 4"
            }
        ));
        jScrollPane1.setViewportView(TabelaItens);

        jp_caixa_faz_pedido.add(jScrollPane1, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 229, 620, 223));

        btnVenda.setText("Venda");
        btnVenda.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnVendaActionPerformed(evt);
            }
        });
        jp_caixa_faz_pedido.add(btnVenda, new org.netbeans.lib.awtextra.AbsoluteConstraints(307, 470, 101, 40));

        btnCancelar.setText("Cancelar");
        btnCancelar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnCancelarActionPerformed(evt);
            }
        });
        jp_caixa_faz_pedido.add(btnCancelar, new org.netbeans.lib.awtextra.AbsoluteConstraints(426, 470, 101, 40));

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jp_caixa_faz_pedido, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jp_caixa_faz_pedido, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

private void txtCodProdutoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_txtCodProdutoActionPerformed
    Buscar();
}//GEN-LAST:event_txtCodProdutoActionPerformed

private void btnPesquisarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnPesquisarActionPerformed
    BuscaProduto buscaProduto = new BuscaProduto(this, true);
    buscaProduto.show();

    if (buscaProduto.getDescricao() != null) {
        txtCodProduto.setText(buscaProduto.getCodigo());
        txtProdutoDescricao.setText(buscaProduto.getDescricao());
        txtValor.setText(buscaProduto.getValor());

        txtQtd.setText("1");
        txtQtd.grabFocus();
    }
}//GEN-LAST:event_btnPesquisarActionPerformed

    private void Adicionar() {
        try {
            if (ChecarCampoAdicionar()) {
                ItemModel item = new ItemModel();
                item.setITEM_DESCRICAO(txtProdutoDescricao.getText());
                item.setITEM_QUANTIDADE(Integer.parseInt(txtQtd.getText()));
                item.setITEM_VALOR(Double.parseDouble(txtValor.getText()) * item.getITEM_QUANTIDADE());


                model.addRow(new Object[]{item.getITEM_DESCRICAO(), item.getITEM_VALOR(), item.getITEM_QUANTIDADE()});

                TabelaItens.setModel(model);

                itens.add(item);

                valorTotal += item.getITEM_VALOR();
                lblValorTotal.setText(valorTotal.toString());
            }
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage());
        }
    }

    private boolean ChecarCampoAdicionar() {
        if (txtMesa.equals("0") || txtMesa.equals("")) {
            JOptionPane.showMessageDialog(null, "É obrigatório preencher o campo Mesa!");
            return false;
        } else if (txtProdutoDescricao.equals("")) {
            JOptionPane.showMessageDialog(null, "É obrigatório preencher o campo Descrição!");
            return false;
        } else if (txtValor.equals("") || txtValor.equals("0")) {
            JOptionPane.showMessageDialog(null, "O campo valor não pode ser 0!");
            return false;
        } else if (txtQtd.equals("") || txtQtd.equals("0")) {
            JOptionPane.showMessageDialog(null, "A quantidade não pode ser 0!");
            return false;
        } else {
            return true;
        }
    }

private void btnAdicionarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnAdicionarActionPerformed

    Adicionar();
}//GEN-LAST:event_btnAdicionarActionPerformed

private void btnRemoverActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnRemoverActionPerformed
    try {
        Object objeto = TabelaItens.getValueAt(TabelaItens.getSelectedRow(), 1);
        Double valor = Double.parseDouble(objeto.toString());

        objeto = TabelaItens.getValueAt(TabelaItens.getSelectedRow(), 2);
        int quantidade = Integer.parseInt(objeto.toString());

        valorTotal -= valor * quantidade;
        lblValorTotal.setText(valorTotal.toString());

        this.itens.remove(TabelaItens.getSelectedRow());
        this.model.removeRow(TabelaItens.getSelectedRow());
    } catch (ArrayIndexOutOfBoundsException ex) {
        JOptionPane.showMessageDialog(null, "É necessário selecionar um item na lista para remove-lo!");
    } catch (Exception ex) {
        JOptionPane.showMessageDialog(null, ex.getMessage());
    }
}//GEN-LAST:event_btnRemoverActionPerformed

private void txtQtdActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_txtQtdActionPerformed
    Adicionar();
    txtProdutoDescricao.setText("");
    txtQtd.setText("1");
    txtValor.setText("");
    txtCodProduto.grabFocus();
}//GEN-LAST:event_txtQtdActionPerformed

private void btnCancelarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnCancelarActionPerformed
    this.dispose();
}//GEN-LAST:event_btnCancelarActionPerformed

    private void Venda() {
        if (itens != null) {
            if (JOptionPane.showConfirmDialog(null, "Confirma a venda?") == JOptionPane.OK_OPTION) {
                try {
                    VendaRepository vendaRepository = new VendaRepository();

                    Double valorVenda = 0.0;
                    for (ItemModel item : itens) {
                        valorVenda += item.getITEM_VALOR();
                    }

                    Date hoje = new Date();
                    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");

                    VendaModel venda = new VendaModel();
                    venda.setVENDA_DT_CADASTRO(sdf.format(hoje));
                    venda.setVENDA_MESA(Integer.parseInt(txtMesa.getText()));
                    venda.setVENDA_VALOR(valorVenda);
                    venda.setVENDA_STATUS("A");

                    if (vendaRepository.Salvar(venda, itens)) {
                        JOptionPane.showMessageDialog(null, "Venda realizada com sucesso!");
                        this.dispose();
                    }
                } catch (Exception ex) {
                    JOptionPane.showMessageDialog(null, ex.getMessage());
                }

            }
        } else {
            JOptionPane.showMessageDialog(null, "Não é possível efetuar a venda! A venda não possui nenhum item!");
        }
    }

    private void AlterarVenda() {
        if (itens != null) {
            if (JOptionPane.showConfirmDialog(null, "Confirma a bla bla bla venda?") == JOptionPane.OK_OPTION) {
                try {
                    VendaRepository vendaRepository = new VendaRepository();

                    Double valorVenda = 0.0;
                    for (ItemModel item : itens) {
                        valorVenda += item.getITEM_VALOR();
                    }

                    Date hoje = new Date();
                    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");

                    VendaModel venda = new VendaModel();
                    venda.setVENDA_DT_CADASTRO(sdf.format(hoje));
                    venda.setVENDA_MESA(Integer.parseInt(txtMesa.getText()));
                    venda.setVENDA_VALOR(valorVenda);
                    venda.setVENDA_ID(this.IdVenda);

                    if (vendaRepository.Alterar(venda, itens)) {
                        JOptionPane.showMessageDialog(null, "Venda realizada com sucesso!");
                        this.dispose();
                    }
                } catch (Exception ex) {
                    JOptionPane.showMessageDialog(null, ex.getMessage());
                }

            }
        } else {

            JOptionPane.showMessageDialog(null, "Não é possível efetuar a venda! A venda não possui nenhum item!");
        }
    }

private void btnVendaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnVendaActionPerformed

    if (this.IdVenda == 0) {
        Venda();
    } else {
        AlterarVenda();
    }

}//GEN-LAST:event_btnVendaActionPerformed

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(Caixa.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(Caixa.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(Caixa.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(Caixa.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the dialog */
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                Caixa dialog = new Caixa(new javax.swing.JFrame(), true);
                dialog.addWindowListener(new java.awt.event.WindowAdapter() {

                    @Override
                    public void windowClosing(java.awt.event.WindowEvent e) {
                        System.exit(0);
                    }
                });
                dialog.setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JLabel Descricção;
    private javax.swing.JTable TabelaItens;
    private javax.swing.JButton btnAdicionar;
    private javax.swing.JButton btnCancelar;
    private javax.swing.JButton btnPesquisar;
    private javax.swing.JButton btnRemover;
    private javax.swing.JButton btnVenda;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JPanel jp_caixa_faz_pedido;
    private javax.swing.JLabel lblValorTotal;
    private javax.swing.JTextField txtCodProduto;
    private javax.swing.JTextField txtMesa;
    private javax.swing.JTextField txtProdutoDescricao;
    private javax.swing.JTextField txtQtd;
    private javax.swing.JTextField txtValor;
    // End of variables declaration//GEN-END:variables
}
